// common/services/business_service/auth_service.dart
import 'package:flutter/foundation.dart';
import 'package:get/get.dart';
import 'package:rental/common/models/auth/login_request.dart';
import 'package:rental/common/models/auth/token_model.dart';
import 'package:rental/common/models/common/api_response.dart';
import '../storage_service.dart';
import '../../api/auth_api.dart';

/// 认证业务服务 - 负责业务逻辑、API调用和本地存储管理
/// 为Controller层提供完整的认证功能
class AuthService extends GetxService {
  late final StorageService _storageService;
  
  @override
  void onInit() {
    super.onInit();
    _storageService = Get.find<StorageService>();
  }
  
  /// 用户登录 - 完整的登录流程
  /// 
  /// 参数：
  /// - loginRequest: 登录请求模型
  /// - rememberMe: 是否记住用户名
  /// 
  /// 返回：
  /// - ApiResponse<TokenModel>: 登录结果
  Future<ApiResponse<TokenModel>> login({
    required LoginRequest loginRequest,
    bool rememberMe = false,
  }) async {
    try {
      // 调用API进行登录
      final response = await AuthApi.login(loginRequest);
      
      if (response.success && response.data != null) {
        // 登录成功，保存令牌信息
        await saveTokenInfo(
          tokenModel: response.data!,
          username: loginRequest.username,
          rememberMe: rememberMe,
        );
        
        debugPrint('AuthService: 用户登录成功');
      } else {
        debugPrint('AuthService: 用户登录失败: ${response.message}');
      }
      
      return response;
    } catch (e) {
      debugPrint('AuthService: 登录过程中发生错误: $e');
      return ApiResponse.error(message: '登录失败: $e');
    }
  }
  
  /// 保存登录令牌信息到本地存储
  /// 
  /// 参数：
  /// - tokenModel: TokenModel令牌模型
  /// - username: 用户名（用于记住用户名功能）
  /// - rememberMe: 是否记住用户名
  Future<void> saveTokenInfo({
    required TokenModel tokenModel,
    required String username,
    bool rememberMe = false,
  }) async {
    try {
      // 保存访问令牌
      await _storageService.saveToken(tokenModel.accessToken);
      
      // 保存刷新令牌
      _storageService.setString('refresh_token', tokenModel.refreshToken);
      
      // 保存令牌过期时间
      final expiryTime = DateTime.now().add(Duration(minutes: tokenModel.expiresIn));
      _storageService.setString('token_expiry', expiryTime.toIso8601String());
      
      // 保存刷新令牌过期时间
      final refreshExpiryTime = DateTime.now().add(Duration(minutes: tokenModel.refreshExpiresIn));
      _storageService.setString('refresh_token_expiry', refreshExpiryTime.toIso8601String());
      
      // 处理记住用户名功能
      if (rememberMe) {
        _storageService.setString('remembered_username', username);
        _storageService.setBool('remember_me', true);
      } else {
        _storageService.remove('remembered_username');
        _storageService.setBool('remember_me', false);
      }
      
      debugPrint('AuthService: 令牌信息保存成功'); 
    } catch (e) {
      debugPrint('AuthService: 保存令牌信息失败: $e');
      rethrow;
    }
  }
  
  /// 获取本地存储的访问令牌
  String? getAccessToken() {
    return _storageService.getToken();
  }
  
  /// 获取本地存储的刷新令牌
  String? getRefreshToken() {
    return _storageService.getString('refresh_token');
  }
  
  /// 检查访问令牌是否过期
  bool isAccessTokenExpired() {
    final expiryString = _storageService.getString('token_expiry');
    if (expiryString == null) return true;
    
    try {
      final expiryTime = DateTime.parse(expiryString);
      return DateTime.now().isAfter(expiryTime);
    } catch (e) {
      return true;
    }
  }
  
  /// 检查刷新令牌是否过期
  bool isRefreshTokenExpired() {
    final expiryString = _storageService.getString('refresh_token_expiry');
    if (expiryString == null) return true;
    
    try {
      final expiryTime = DateTime.parse(expiryString);
      return DateTime.now().isAfter(expiryTime);
    } catch (e) {
      return true;
    }
  }
  
  /// 获取记住的用户名
  String? getRememberedUsername() {
    final isRemembered = _storageService.getBool('remember_me') ?? false;
    if (isRemembered) {
      return _storageService.getString('remembered_username');
    }
    return null;
  }
  
  /// 检查是否记住用户名
  bool isRememberMe() {
    return _storageService.getBool('remember_me') ?? false;
  }
  
  /// 清除所有认证相关的本地存储
  Future<void> clearAuthData() async {
    try {
      // 清除令牌（使用StorageService的logout方法）
      await _storageService.logout();
      
      // 清除其他认证相关数据
      _storageService.remove('refresh_token');
      _storageService.remove('token_expiry');
      _storageService.remove('refresh_token_expiry');
      
      // 不清除记住用户名的设置，用户可能希望保留
      
      debugPrint('AuthService: 认证数据清除成功');
    } catch (e) {
      debugPrint('AuthService: 清除认证数据失败: $e');  
      rethrow;
    }
  }
  
  /// 自动刷新令牌
  /// 当访问令牌过期但刷新令牌未过期时，自动刷新令牌
  Future<bool> autoRefreshToken() async {
    try {
      // 检查是否需要刷新
      if (!isAccessTokenExpired()) {
        return true; // 访问令牌未过期，无需刷新
      }
      
      final refreshToken = getRefreshToken();
      if (refreshToken == null || isRefreshTokenExpired()) {
        return false; // 刷新令牌不存在或已过期
      }
      
      // 调用API刷新令牌
      final response = await AuthApi.refreshToken(refreshToken: refreshToken);
      
      if (response.success && response.data != null) {
        // 保存新的令牌信息（不改变记住用户名设置）
        await saveTokenInfo(
          tokenModel: response.data!,
          username: '', // 刷新令牌时不需要用户名
          rememberMe: isRememberMe(), // 保持原有的记住用户名设置
        );
        return true;
      }
      
      return false;
    } catch (e) {
      debugPrint('AuthService: 自动刷新令牌失败: $e');
      return false;
    }
  }
  
  /// 检查用户是否已登录
  /// 基于本地存储的令牌状态判断
  bool isLoggedIn() {
    return _storageService.isLoggedIn;
  }
}